#include <stdio.h>
#include <stdlib.h>

#define INIT_LIST_SIZE  50 //初始ListSize
#define LIST_INCREMENT 10  //List动态增长长度

typedef int ElemType;

typedef struct {
    ElemType *data;
    int length;
    int listSize;
}seqlist;

//初始化表。构造一个空的线性表
//0为初始化成功，-1为失败
int InitList(seqlist *L) {
    L->data = (ElemType *) malloc(sizeof(ElemType) * INIT_LIST_SIZE);
    if (L->data == NULL) {
        //初始化失败
        return -1;
    }
    L->length = 0;
    L->listSize = INIT_LIST_SIZE;
    return 0;
}

//求表长。返回线性表L的长度，即L中数据元素的个数
int Length(seqlist *L) {
    if (L->data == NULL) {
        return 0;
    }
    return L->length;
}

//按值查找操作。在表L中查找具有给定关键字的元素。
//0为未找到，其他为该关键字在表L中的位置
int LocateElem(seqlist L, ElemType e) {
    int i;
    for (i = 0; i < L.length; i++) {
        if (L.data[i] == e) {
            return i + 1;
        }
    }
    return 0;
}

//按位查找操作。获取表L中第i个位置的元素的值
int GetElem(seqlist L, int i, ElemType *e){
    if (i < 0 || i > L.length) {
        return -1;
    }
    *e = L.data[i];
    return 0;
}

//插入操作。在表L中的第i个位置上插入指定元素e
int ListInsert(seqlist *L, int i, ElemType e) {
    if (i < 1 || i > L->listSize) {
        return -1;
    }

    if (L->length >= L->listSize) {
        L->data = (ElemType *) realloc(L->data, (L->listSize + LIST_INCREMENT) * sizeof(ElemType));
        L->listSize += LIST_INCREMENT;
    }

    if (L->data == NULL) {
        return -1;
    }

    int j;
    for (j = L->length; j >= i; j--) {
        L->data[j] = L->data[j - 1];
    }

    L->data[i - 1] = e;
    L->length ++;

    return 0;
}

//删除操作。删除表L中第i个位置的元素，并用e返回删除元素的值
int ListDelete(seqlist *L, int i, ElemType *e) {
    if (i < 1 || i > L->listSize) {
        return -1;
    }
    if (L->data == NULL) {
        return -1;
    } 
    *e = L->data[i - 1];
    int j;
    for( j = i; j < L->length; j++) {
        L->data[j - 1] = L->data[j];
    }
    L->length --;
    return 0;
}

//输出操作。按前后顺序输出线性表L的所有元素值
void PrintList(seqlist L) {
    int i;
    for( i = 0; i < L.length; i++) {
        printf("%d ", L.data[i]);
    }
}

//判空操作。若L为空表，则返回0，否则返回-1
int Empty(seqlist L) {
    if (L.length == 0) {
        return -1;
    }
    return 0;
}

//销毁操作。销毁线性表，并释放线性表L所占用的内存空间
void DestroyList(seqlist *L) {
    while(!L->data) {
        free(L->data);
    }
    L->length = 0;
}